const boom = require("boom");

const User = require("../models/common");
const Role = require("../models/role");

module.exports.checkPermission = async (req, reply) => {
  try {
    // 根据已验证的用户数据获取用户信息
    const existingUser = await User.findOne({ phone: req.user.phone });
    const existingRole = await Role.findById(existingUser.roleId);

    // 获取当前请求的方法和 URL
    const requestMethod = req.method.toLowerCase();
    const requestUrl = req.url;

    // 构造要匹配的URL模板
    const templateUrls = ["/api/pet/{id}", "/api/pet", "/api/orders/{orderid}"];

    // 检查权限
    let hasPermission = false;
    for (const templateUrl of templateUrls) {
      const permission = existingRole.permissions.find((permission) => {
        // 如果方法不匹配，则跳过该权限
        if (permission.method.toLowerCase() !== requestMethod) {
          return false;
        }

        // 如果URL完全匹配，则直接返回 true
        if (permission.url === requestUrl) {
          return true;
        }

        // 处理带有动态参数的URL
        if (permission.url === templateUrl) {
          // 将模板URL中的 {id} 或 {orderid} 替换为实际参数值
          const regex = new RegExp(templateUrl.replace(/\{\w+\}/g, "(.*)"));
          // 使用替换后的正则表达式测试请求URL
          return regex.test(requestUrl);
        }

        return false;
      });

      if (permission) {
        hasPermission = true;
        break;
      }
    }

    if (!hasPermission) {
      throw boom.forbidden("没有访问权限");
    }
  } catch (err) {
    throw boom.boomify(err);
  }
};
